const path = require('path')
const fs = require('fs')

/**
 * 递归读取文件夹下文件
 * @param {String} startPath 开始路径
 * @returns {Array}
 */
const findSync = (startPath) => {
  let paths = []
  let dirs = []

  const _finder = (dir) => {
    // 读取文件夹下的所有文件和文件夹
    let files = fs.readdirSync(dir)
    // 遍历每一个路径
    files.forEach((val, index) => {
      // 从开始路径起的完整路径
      let fPath = path.join(dir, val)
      // 当前这一个文件或者文件夹的状态
      let stats = fs.statSync(fPath)

      // 如果当前是文件夹
      if (stats.isDirectory()) {
        dirs.push(fPath)
        // 递归读取文件夹下文件
        return _finder(fPath)
      };
      // 如果当前是
      if (stats.isFile()) {
        paths.push(fPath)
      }
    })

  }
  _finder(startPath)
  return {
    paths: paths.map(item => {
      return item.replace(startPath, '')
    }),
    dirs: dirs.map(item => {
      return item.replace(startPath, '')
    })
  }
}
/**
 * 获取指定文件夹下的所有文件大小
 * @param { string } dir 文件夹路径
 * @param { Function } cd 统计完后的回调方法
 */
const getAllFileSize = (dir, cb) => {
  const { paths } = findSync(dir)
  let allSize = 0
  let readFileCount = 0

  paths.forEach(p => {
    const filePath = path.join(__dirname, p)
    fs.stat(filePath, (err, stats) => {
      readFileCount++
      if (err) {
        console.log(`文件读取出错：${filePath}`)
      } else {
        allSize += stats.size
        if (readFileCount === paths.length) {
          cb?.(allSize)
        }
      }
    })
  })
}
// 指定一个要统计的文件夹
const dir = path.join(__dirname)
getAllFileSize(dir, (size) => {
  console.log(`文件总大小为：${size}`)
})
